package com.ydl.util.excel;

import lombok.Setter;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelChartUtil {
    private SXSSFSheet sheet ;
    private SXSSFWorkbook wb ;
    @Setter
    private com.ydl.util.excel.XYCharParams XYCharParams;
    public static void main(String[] args) {
        // 字段名
        List<String> fldNameArr = new ArrayList<String>();
        // 标题
        List<String> titleArr = new ArrayList<String>();
        // 模拟数据
        List<List<Object>> dataList  = new ArrayList<List<Object>>();
        List<Object> dataMap1 = new ArrayList<>();
        dataMap1.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap1.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap1.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap1.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap1.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap1.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataList.add(dataMap1);

        List<Object> dataMap2 = new ArrayList<>();
        dataMap2.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap2.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap2.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap2.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap2.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap2.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataList.add(dataMap2);



        List<Object> dataMap3 = new ArrayList<>();
        dataMap3.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap3.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap3.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap3.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap3.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataMap3.add(Float.valueOf(String.valueOf(Math.floor(Math.random() * 100)) ));
        dataList.add(dataMap3);
        try {

            XYCharParams xyCharParams = new XYCharParams();


            xyCharParams.setDataList(dataList);
            xyCharParams.setFileName(System.currentTimeMillis() + "");
            IndexParams ctaxIndex = new IndexParams();


            xyCharParams.setCtsIndex(new IndexParams(0, 0, 2, 2));
//            xyCharParams.setCtaxIndex(new IndexParams(1, dataList.size() + 1, 1, 1));
            xyCharParams.setDataIndex(new IndexParams(1, dataList.size(), 2, 3));
            xyCharParams.setDataList(dataList);

            List<String> cellName = new ArrayList<>();
            cellName.add("设备名称");
            cellName.add("时间");
            cellName.add("谐波分量");
            cellName.add("谐波分量2");
            xyCharParams.setTitle(cellName);

            ExcelChartUtil ecu = new ExcelChartUtil();
            ecu.setXYCharParams(xyCharParams);
            SXSSFWorkbook wb = ecu.createTimeXYChar();

            // 创建柱状图
//            ecu.createBarChart(titleArr, fldNameArr, dataList);
            // 创建饼状图
//            ecu.createPieChart(titleArr, fldNameArr, dataList);
            // 创建折线图
            // 创建面积图
//            ecu.createAreaChart(titleArr, fldNameArr, dataList);
            //导出到文件
            FileOutputStream out = new FileOutputStream(new File("/home/ydl/img/" + System.currentTimeMillis() + ".xls"));
            wb.write(out);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

//    /**
//     * 导出折线图
//     * @param response
//     * @throws Exception
//     */
//    public static  void exportAreaChart(HttpServletResponse response, XYCharParams XYCharParams) throws Exception {
//        ExcelChartUtil ecu = new ExcelChartUtil();
//        ecu.setXYCharParams(XYCharParams);
//        SXSSFWorkbook wb = ecu.createTimeXYChar();
//        setResponse(response, wb, XYCharParams.getFileName());
//    }
//
//    private static void setResponse(HttpServletResponse response, SXSSFWorkbook wb, String fileName) throws IOException {
//        response.setHeader("Access-Control-Expose-Headers","Content-Disposition");//指定 Content-Disposition 可以让前端获取
//        // 设置文件头：最后一个参数是设置下载文件名
//        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
//        // 设置文件ContentType类型，这样设置，会自动判断下载文件类型
//        response.setContentType("application/octet-stream;charset=utf-8");
//        /**修改导出的文件后缀为.xls 原因是：office0.16 打开导出的.xlsx文件提示格式损坏*/
//        response.setHeader("Content-Disposition",
//                "attachment;filename=" + URLEncoder.encode(fileName.toString(), "UTF-8") + ".xls");
//        ServletOutputStream out = response.getOutputStream();
//        wb.write(out);
//        out.flush();
//    }

//    /**
//     * 创建柱状图(堆积图，多组)
//     *
//     * @throws IOException
//     */
//    public SXSSFWorkbook createBarChart(List<String> titleArr, List<String> fldNameArr, List<List<Object>> dataList) {
//        SXSSFWorkbook wb = new SXSSFWorkbook();
//        // 创建一个sheet页
//        sheet = wb.createSheet("sheet0");
//        // drawSheet0Table(sheet,titleArr,fldNameArr,dataList);
//        // 堆积=STBarGrouping.STACKED 多组=STBarGrouping.CLUSTERED
//        boolean result = drawSheet0Map(sheet, STBarGrouping.CLUSTERED, fldNameArr, dataList, titleArr);
//        return wb;
//    }
//    /**
//     * 生成柱状图
//     *
//     * @param sheet
//     *            页签
//     * @param group
//     *            柱状图类型(堆积,多组)
//     * @param fldNameArr
//     *            坐标名称
//     * @param dataList
//     *            统计数据
//     * @return
//     */
//    private boolean drawSheet0Map(SXSSFSheet sheet, STBarGrouping.Enum group, List<String> fldNameArr,
//                                  List<List<Object>> dataList, List<String> titleArr) {
//        boolean result = false;
//        // 获取sheet名称
//        String sheetName = sheet.getSheetName();
//        result = drawSheet0Table(sheet, titleArr, fldNameArr, dataList);
//        // 创建一个画布
//        Drawing drawing = sheet.createDrawingPatriarch();
//        // 画一个图区域
//        // 前四个默认0，从第8行到第25行,从第0列到第6列的区域
//        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 6, 25);
//        // 创建一个chart对象
//        Chart chart = drawing.createChart(anchor);
//        CTChart ctChart = ((XSSFChart) chart).getCTChart();
//        CTPlotArea ctPlotArea = ctChart.getPlotArea();
//        // 创建柱状图模型
//        CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
//        CTBoolean ctBoolean = ctBarChart.addNewVaryColors();
//        ctBarChart.getVaryColors().setVal(true);
//        // 设置图类型
//        ctBarChart.addNewGrouping().setVal(group);
//        ctBoolean.setVal(true);
//        ctBarChart.addNewBarDir().setVal(STBarDir.COL);
//        // 是否添加左侧坐标轴
//        ctChart.addNewDispBlanksAs().setVal(STDispBlanksAs.ZERO);
//        ctChart.addNewShowDLblsOverMax().setVal(true);
//        // 设置这两个参数是为了在STACKED模式下生成堆积模式；(standard)标准模式时需要将这两行去掉
//        if ("stacked".equals(group.toString()) || "percentStacked".equals(group.toString())) {
//            ctBarChart.addNewGapWidth().setVal(150);
//            ctBarChart.addNewOverlap().setVal((byte) 100);
//        }
//        // 创建序列,并且设置选中区域
//        for (int i = 0; i < fldNameArr.size() - 1; i++) {
//            CTBarSer ctBarSer = ctBarChart.addNewSer();
//            CTSerTx ctSerTx = ctBarSer.addNewTx();
//            // 图例区
//            CTStrRef ctStrRef = ctSerTx.addNewStrRef();
//            // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
//            String legendDataRange = new CellRangeAddress(0, 0, i + 1, i + 1).formatAsString(sheetName, true);
//            ctStrRef.setF(legendDataRange);
//            ctBarSer.addNewIdx().setVal(i);
//            // 横坐标区
//            CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
//            ctStrRef = cttAxDataSource.addNewStrRef();
//            // 选第0列,第1-6行作为横坐标区域
//            String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0).formatAsString(sheetName, true);
//            ctStrRef.setF(axisDataRange);
//            // 数据区域
//            CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
//            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
//            // 选第1-6行,第1-3列作为数据区域 //1 2 3
//            String numDataRange = new CellRangeAddress(1, dataList.size(), i + 1, i + 1).formatAsString(sheetName,
//                    true);
//            ctNumRef.setF(numDataRange);
//            // 添加柱状边框线
//            ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] { 0, 0, 0 });
//            // 设置负轴颜色不是白色
//            ctBarSer.addNewInvertIfNegative().setVal(false);
//            // 设置标签格式
//            ctBoolean.setVal(false);
//            CTDLbls newDLbls = ctBarSer.addNewDLbls();
//            newDLbls.setShowLegendKey(ctBoolean);
//            ctBoolean.setVal(true);
//            newDLbls.setShowVal(ctBoolean);
//            ctBoolean.setVal(false);
//            newDLbls.setShowCatName(ctBoolean);
//            newDLbls.setShowSerName(ctBoolean);
//            newDLbls.setShowPercent(ctBoolean);
//            newDLbls.setShowBubbleSize(ctBoolean);
//            newDLbls.setShowLeaderLines(ctBoolean);
//        }
//        // 告诉BarChart它有坐标轴，并给它们id
//        ctBarChart.addNewAxId().setVal(123456);
//        ctBarChart.addNewAxId().setVal(123457);
//        // 横坐标
//        CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
//        ctCatAx.addNewAxId().setVal(123456); // id of the cat axis
//        CTScaling ctScaling = ctCatAx.addNewScaling();
//        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
//        ctCatAx.addNewAxPos().setVal(STAxPos.B);
//        ctCatAx.addNewCrossAx().setVal(123457); // id of the val axis
//        ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//        // 纵坐标
//        CTValAx ctValAx = ctPlotArea.addNewValAx();
//        ctValAx.addNewAxId().setVal(123457); // id of the val axis
//        ctScaling = ctValAx.addNewScaling();
//        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
//        // 设置位置
//        ctValAx.addNewAxPos().setVal(STAxPos.L);
//        ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis
//        ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//        // 是否删除主左边轴
//        ctValAx.addNewDelete().setVal(false);
//        // 是否删除横坐标
//        ctCatAx.addNewDelete().setVal(false);
//        // legend图注
//        // if(true){
//        CTLegend ctLegend = ctChart.addNewLegend();
//        ctLegend.addNewLegendPos().setVal(STLegendPos.B);
//        ctLegend.addNewOverlay().setVal(false);
//        // }
//        return result;
//    }
//    /**
//     * 创建横向柱状图
//     *
//     * @throws IOException
//     */
//    public void createAreaChart(List<String> titleArr, List<String> fldNameArr,
//                                List<List<Object>> dataList) {
//        SXSSFWorkbook wb = new SXSSFWorkbook();
//        // 创建一个sheet页
//        sheet = wb.createSheet("sheet1");
//        boolean result = drawSheet1Map(sheet, "is3D", fldNameArr, dataList, titleArr);
//    }
//    /**
//     * 生成面积图
//     * @param sheet
//     * @param type
//     * @param fldNameArr
//     * @param dataList
//     * @param titleArr
//     * @return
//     */
//    private boolean drawSheet1Map(SXSSFSheet sheet, String type, List<String> fldNameArr,
//                                  List<List<Object>> dataList, List<String> titleArr) {
//        boolean result = false;
//        // 获取sheet名称
//        String sheetName = sheet.getSheetName();
//        result = drawSheet0Table(sheet, titleArr, fldNameArr, dataList);
//        // 创建一个画布
//        Drawing drawing = sheet.createDrawingPatriarch();
//        // 画一个图区域
//        // 前四个默认0，从第8行到第25行,从第0列到第6列的区域
//        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 6, 25);
//        // 创建一个chart对象
//        Chart chart = drawing.createChart(anchor);
//        CTChart ctChart = ((XSSFChart) chart).getCTChart();
//        CTPlotArea ctPlotArea = ctChart.getPlotArea();
//        CTAreaChart ctAreaChart = ctPlotArea.addNewAreaChart();
//        CTBoolean ctBoolean = ctAreaChart.addNewVaryColors();
//        ctAreaChart.addNewGrouping().setVal(STGrouping.STANDARD);
//        // 创建序列,并且设置选中区域
//        for (int i = 2; i < fldNameArr.size() - 1; i++) {
//            CTAreaSer ctAreaSer = ctAreaChart.addNewSer();
//            CTSerTx ctSerTx = ctAreaSer.addNewTx();
//            // 图例区
//            CTStrRef ctStrRef = ctSerTx.addNewStrRef();
//            // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
//            String legendDataRange = new CellRangeAddress(0, 0, i + 1, i + 1).formatAsString(sheetName, true);
//            ctStrRef.setF(legendDataRange);
//            ctAreaSer.addNewIdx().setVal(i);
//            // 横坐标区
//            CTAxDataSource cttAxDataSource = ctAreaSer.addNewCat();
//            ctStrRef = cttAxDataSource.addNewStrRef();
//            // 选第0列,第1-6行作为横坐标区域
//            String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0).formatAsString(sheetName, true);
//            ctStrRef.setF(axisDataRange);
//            // 数据区域
//            CTNumDataSource ctNumDataSource = ctAreaSer.addNewVal();
//            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
//            // 选第1-6行,第1-3列作为数据区域 //1 2 3
//            String numDataRange = new CellRangeAddress(1, dataList.size(), i + 1, i + 1).formatAsString(sheetName,
//                    true);
//            ctNumRef.setF(numDataRange);
//            // 设置标签格式
//            ctBoolean.setVal(false);
//            CTDLbls newDLbls = ctAreaSer.addNewDLbls();
//            newDLbls.setShowLegendKey(ctBoolean);
//            ctBoolean.setVal(true);
//            newDLbls.setShowVal(ctBoolean);
//            ctBoolean.setVal(false);
//            newDLbls.setShowCatName(ctBoolean);
//            newDLbls.setShowSerName(ctBoolean);
//            newDLbls.setShowPercent(ctBoolean);
//            newDLbls.setShowBubbleSize(ctBoolean);
//            newDLbls.setShowLeaderLines(ctBoolean);
//            /*
//             * //是否是平滑曲线 CTBoolean addNewSmooth = ctAreaSer.addNewSmooth();
//             * addNewSmooth.setVal(false); //是否是堆积曲线 CTMarker addNewMarker =
//             * ctAreaSer.addNewMarker(); CTMarkerStyle addNewSymbol =
//             * addNewMarker.addNewSymbol();
//             * addNewSymbol.setVal(STMarkerStyle.NONE);
//             */
//        }
//        // telling the BarChart that it has axes and giving them Ids
//        ctAreaChart.addNewAxId().setVal(123456);
//        ctAreaChart.addNewAxId().setVal(123457);
//        // cat axis
//        CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
//        ctCatAx.addNewAxId().setVal(123456); // id of the cat axis
//        CTScaling ctScaling = ctCatAx.addNewScaling();
//        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
//        ctCatAx.addNewAxPos().setVal(STAxPos.B);
//        ctCatAx.addNewCrossAx().setVal(123457); // id of the val axis
//        ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//        // val axis
//        CTValAx ctValAx = ctPlotArea.addNewValAx();
//        ctValAx.addNewAxId().setVal(123457); // id of the val axis
//        ctScaling = ctValAx.addNewScaling();
//        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
//        ctValAx.addNewAxPos().setVal(STAxPos.L);
//        ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis
//        ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//        // 是否删除主左边轴
//        ctValAx.addNewDelete().setVal(false);
//        // 是否删除横坐标
//        ctCatAx.addNewDelete().setVal(false);
//        // legend图注
//        CTLegend ctLegend = ctChart.addNewLegend();
//        ctLegend.addNewLegendPos().setVal(STLegendPos.B);
//        ctLegend.addNewOverlay().setVal(false);
//        return result;
//    }
//    /**
//     * 创建饼状图
//     *
//     * @throws IOException
//     */
//    public void createPieChart(List<String> titleArr, List<String> fldNameArr, List<List<Object>> dataList) {
//        SXSSFWorkbook wb = new SXSSFWorkbook();
//        // 创建一个sheet页
//        sheet = wb.createSheet("sheet2");
//        boolean result = drawSheet2Map(sheet, "is3D", fldNameArr, dataList, titleArr);
//    }
//    /**
//     * 创建饼状图
//     *
//     * @param sheet
//     *            页签
//     * @param type
//     *            图类型(3D或者普通)
//     * @param fldNameArr
//     *            (类标题)
//     * @param dataList
//     *            (填充数据)
//     * @param titleArr
//     *            (标题)
//     * @return
//     */
//    private boolean drawSheet2Map(SXSSFSheet sheet, String type, List<String> fldNameArr,
//                                  List<List<Object>> dataList, List<String> titleArr) {
//        boolean result = false;
//        // 获取sheet名称
//        String sheetName = sheet.getSheetName();
//        result = drawSheet0Table(sheet, titleArr, fldNameArr, dataList);
//        // 创建一个画布
//        Drawing drawing = sheet.createDrawingPatriarch();
//        // 画一个图区域
//        // 前四个默认0，从第8行到第25行,从第0列到第6列的区域
//        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 6, 25);
//        // 创建一个chart对象
//        Chart chart = drawing.createChart(anchor);
//        CTChart ctChart = ((XSSFChart) chart).getCTChart();
//        CTPlotArea ctPlotArea = ctChart.getPlotArea();
//        CTBoolean ctBoolean = null;
//        CTPie3DChart ctPie3DChart = null;
//        CTPieChart ctPieChart = null;
//        // 创建饼状图模型
//        if (type.equals("is3D")) {
//            ctPie3DChart = ctPlotArea.addNewPie3DChart();
//            ctBoolean = ctPie3DChart.addNewVaryColors();
//        } else {
//            ctPieChart = ctPlotArea.addNewPieChart();
//            ctBoolean = ctPieChart.addNewVaryColors();
//        }
//        // 创建序列,并且设置选中区域
//        for (int i = 0; i < fldNameArr.size() - 1; i++) {
//            CTPieSer ctPieSer = null;
//            if (type.equals("is3D")) {
//                ctPieSer = ctPie3DChart.addNewSer();
//            } else {
//                ctPieSer = ctPieChart.addNewSer();
//            }
//            CTSerTx ctSerTx = ctPieSer.addNewTx();
//            // 图例区
//            CTStrRef ctStrRef = ctSerTx.addNewStrRef();
//            // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
//            String legendDataRange = new CellRangeAddress(0, 0, i + 1, i + 1).formatAsString(sheetName, true);
//            ctStrRef.setF(legendDataRange);
//            ctPieSer.addNewIdx().setVal(i);
//            // 横坐标区
//            CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
//            ctStrRef = cttAxDataSource.addNewStrRef();
//            // 选第0列,第1-6行作为横坐标区域
//            String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0).formatAsString(sheetName, true);
//            ctStrRef.setF(axisDataRange);
//            // 数据区域
//            CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
//            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
//            // 选第1-6行,第1-3列作为数据区域 //1 2 3
//            String numDataRange = new CellRangeAddress(1, dataList.size(), i + 1, i + 1).formatAsString(sheetName,
//                    true);
//            ctNumRef.setF(numDataRange);
//            // 显示边框线
//            ctPieSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] { 0, 0, 0 });
//            // 设置标签格式
//            ctBoolean.setVal(true);
//        }
//        // legend图注
//        CTLegend ctLegend = ctChart.addNewLegend();
//        ctLegend.addNewLegendPos().setVal(STLegendPos.B);
//        ctLegend.addNewOverlay().setVal(true);
//        return result;
//    }
//


    /**
     * 创建折线图
     *
     * @throws IOException
     */
    public SXSSFWorkbook createTimeXYChar() {
        wb = new SXSSFWorkbook();
        // 创建一个sheet页
        sheet = wb.createSheet("sheet");
        // 第二个参数折线图类型:line=普通折线图,line-bar=折线+柱状图
        boolean result = drawSheet3Map();
        return  wb;
    }
    /**
     * 生成折线图
     * @return
     */
    private boolean drawSheet3Map() {
        boolean result = false;
        // 获取sheet名称
        String sheetName = sheet.getSheetName();
        result = drawSheet0Table();
        // 创建一个画布
        Drawing drawing = sheet.createDrawingPatriarch();
        // 画一个图区域
        // 前四个默认0，从第8行到第25行,从第0列到第6列的区域
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 6, 25);
        // 创建一个chart对象
        Chart chart = drawing.createChart(anchor);
        CTChart ctChart = ((XSSFChart) chart).getCTChart();
        CTPlotArea ctPlotArea = ctChart.getPlotArea();
        // 折线图
        CTLineChart ctLineChart = ctPlotArea.addNewLineChart();
        CTBoolean ctBoolean = ctLineChart.addNewVaryColors();
        ctLineChart.addNewGrouping().setVal(STGrouping.STANDARD);

        int ctsCol = XYCharParams.getCtsIndex().getFirstCol();
        for (int col = XYCharParams.getDataIndex().getFirstCol(); col <= XYCharParams.getDataIndex().getLastCol(); col++) {
            CTLineSer ctLineSer = ctLineChart.addNewSer();
            CTSerTx ctSerTx = ctLineSer.addNewTx();

            if (XYCharParams.getCtsIndex() != null) {
                // 图例区
                CTStrRef ctStrRef = ctSerTx.addNewStrRef();
                // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
                String legendDataRange = new CellRangeAddress(XYCharParams.getCtsIndex().getFirstRow(),
                        XYCharParams.getCtsIndex().getLastRow(), ctsCol,
                        ctsCol).formatAsString(sheetName, true);
                ctStrRef.setF(legendDataRange);
                ctsCol++;
            }

            ctLineSer.addNewIdx().setVal(0);
            if (XYCharParams.getCtaxIndex() != null) {
                // 横坐标区
                CTAxDataSource cttAxDataSource = ctLineSer.addNewCat();
                CTStrRef ctStrRef = cttAxDataSource.addNewStrRef();
                //             选第0列,第1-6行作为横坐标区域
                String axisDataRange = new CellRangeAddress( XYCharParams.getCtaxIndex().getFirstRow(), XYCharParams.getCtaxIndex().getLastRow(),
                        XYCharParams.getCtaxIndex().getFirstCol(),  XYCharParams.getCtaxIndex().getLastCol()).formatAsString(sheetName, true);
                ctStrRef.setF(axisDataRange);
            }

            // 数据区域
            CTNumDataSource ctNumDataSource = ctLineSer.addNewVal();
            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
            // 选第1-6行,第1-3列作为数据区域 //1 2 3
            String numDataRange = new CellRangeAddress(XYCharParams.getDataIndex().getFirstRow(), XYCharParams.getDataIndex().getLastRow(),
                    col, col).formatAsString(sheetName,
                    true);

            ctNumRef.setF(numDataRange);
            // 设置标签格式
            ctBoolean.setVal(false);
            CTDLbls newDLbls = ctLineSer.addNewDLbls();
            newDLbls.setShowLegendKey(ctBoolean);
            ctBoolean.setVal(true);
            newDLbls.setShowVal(ctBoolean);
            ctBoolean.setVal(false);
            newDLbls.setShowCatName(ctBoolean);
            newDLbls.setShowSerName(ctBoolean);
            newDLbls.setShowPercent(ctBoolean);
            newDLbls.setShowBubbleSize(ctBoolean);
            newDLbls.setShowLeaderLines(ctBoolean);
            // 是否是平滑曲线
            CTBoolean addNewSmooth = ctLineSer.addNewSmooth();
            addNewSmooth.setVal(false);
            // 是否是堆积曲线
            CTMarker addNewMarker = ctLineSer.addNewMarker();
            CTMarkerStyle addNewSymbol = addNewMarker.addNewSymbol();
            addNewSymbol.setVal(STMarkerStyle.NONE);
        }

//        }
        // telling the BarChart that it has axes and giving them Ids
        ctLineChart.addNewAxId().setVal(123456);
        ctLineChart.addNewAxId().setVal(123457);
        // cat axis
        CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
        ctCatAx.addNewAxId().setVal(123456); // id of the cat axis
        CTScaling ctScaling = ctCatAx.addNewScaling();
        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctCatAx.addNewAxPos().setVal(STAxPos.B);
        ctCatAx.addNewCrossAx().setVal(123457); // id of the val axis
        ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
        // val axis
        CTValAx ctValAx = ctPlotArea.addNewValAx();
        ctValAx.addNewAxId().setVal(123457); // id of the val axis
        ctScaling = ctValAx.addNewScaling();
        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctValAx.addNewAxPos().setVal(STAxPos.L);
        ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis
        ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
        // 是否删除主左边轴
        ctValAx.addNewDelete().setVal(false);
//        // 是否删除横坐标
//        if (type.equals("line-bar")) {
//            ctCatAx.addNewDelete().setVal(true);
//        }
        CTLegend ctLegend = ctChart.addNewLegend();
        ctLegend.addNewLegendPos().setVal(STLegendPos.B);
        ctLegend.addNewOverlay().setVal(false);
        return result;
    }
    /**
     * 生成数据表
     *
     *            数据
     * @return 是否生成成功
     */
    private boolean drawSheet0Table() {
        // 测试时返回值
        boolean result = true;
        // 初始化表格样式
        List<CellStyle> styleList = tableStyle();
        // 根据数据创建excel第一行标题行
        SXSSFRow row0 = sheet.createRow(0);
        for (int i = 0; i < XYCharParams.getTitle().size(); i++) {
            // 设置标题
            row0.createCell(i).setCellValue(XYCharParams.getTitle().get(i));
            // 设置标题行样式
            row0.getCell(i).setCellStyle(styleList.get(0));
        }
        // 填充数据
        for (int i = 0; i < XYCharParams.getDataList().size(); i++) {
            // 获取每一项的数据
            List<Object> data = XYCharParams.getDataList().get(i);
            // 设置每一行的字段标题和数据
            SXSSFRow rowi = sheet.createRow(i + 1);
            for (int j = 0; j < data.size(); j++) {
                Object obj = data.get(j);
                if (obj instanceof  Float) {
                    CellStyle cellStyle = wb.createCellStyle();
                    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
                    SXSSFCell cell =  rowi.createCell(j);
                    cell.setCellStyle(cellStyle);
                    cell.setCellValue(Double.valueOf(obj.toString()));
                } else {
                    rowi.createCell(j).setCellValue(obj.toString());
                }
            }
        }
        return result;
    }
    /**
     * 生成表格样式
     *
     * @return
     */
    private  List<CellStyle> tableStyle() {
        List<CellStyle> cellStyleList = new ArrayList<CellStyle>();
        // 样式准备
        // 标题样式
        CellStyle style = wb.createCellStyle();
        style.setFillForegroundColor(IndexedColors.ROYAL_BLUE.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setBorderBottom(BorderStyle.THIN); // 下边框
        style.setBorderLeft(BorderStyle.THIN);// 左边框
        style.setBorderTop(BorderStyle.THIN);// 上边框
        style.setBorderRight(BorderStyle.THIN);// 右边框
        style.setAlignment(HorizontalAlignment.CENTER);
        cellStyleList.add(style);
        CellStyle style1 = wb.createCellStyle();
        style1.setBorderBottom(BorderStyle.THIN); // 下边框
        style1.setBorderLeft(BorderStyle.THIN);// 左边框
        style1.setBorderTop(BorderStyle.THIN);// 上边框
        style1.setBorderRight(BorderStyle.THIN);// 右边框
        style1.setAlignment(HorizontalAlignment.CENTER);
        cellStyleList.add(style1);
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
        cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
        cellStyle.setBorderLeft(BorderStyle.THIN);// 左边框
        cellStyle.setBorderRight(BorderStyle.THIN);// 右边框
        cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平对齐方式
        // cellStyle.setVerticalAlignment(VerticalAlignment.TOP);//垂直对齐方式
        cellStyleList.add(cellStyle);
        return cellStyleList;
    }
}
